Manejo de datos

Transformar datos en R con dplyr

Manejo de datos

La exploración de datos es el primer paso para:

  • Verificar su calidad
  • Comprender la información con la que trabajamos
  • Detectar errores o valores atípicos
  • Preparar los datos para su análisis o visualización

Buenas prácticas en el manejo de datos

Nombres y valores 🧩

  • Evita espacios, números o caracteres especiales en los nombres de columnas
  • No combines varias informaciones en una misma celda
  • Anota los ceros (0) cuando existen — no los dejes vacíos!!
  • Usa NA o celdas vacías para indicar datos faltantes
  • Separa las fechas en columnas: year, month, day

Organizacion tabla

Hertz & McNeill 2024

Tidyverse

El universo ordenado

El tidyverse es una colección de paquetes de R

  • Para hacer más fácil y coherente el trabajo con datos.
  • Los datos deben ser ordenados (tidy)
  • El código legible
  • Resultados reproducibles

Estructura y formato

  • Cada variable en una columna
  • Cada observación en una fila
  • Cada valor tiene su propia celda

Ejemplo organización “tidy”

Tidyverse

tidyverse::tidyverse_packages()
 [1] "broom"         "conflicted"    "cli"           "dbplyr"       
 [5] "dplyr"         "dtplyr"        "forcats"       "ggplot2"      
 [9] "googledrive"   "googlesheets4" "haven"         "hms"          
[13] "httr"          "jsonlite"      "lubridate"     "magrittr"     
[17] "modelr"        "pillar"        "purrr"         "ragg"         
[21] "readr"         "readxl"        "reprex"        "rlang"        
[25] "rstudioapi"    "rvest"         "stringr"       "tibble"       
[29] "tidyr"         "xml2"          "tidyverse"    

Pipes

  • %>% y |>
library(dplyr)

# El propio de dplyr  (control  (command) + shift + M)
iris %>%
  filter(Sepal.Length > 5) %>%
  summarise(promedio = mean(Sepal.Width)) 
  promedio
1 3.048305
# el de R desde hace unos años
iris |>
  filter(Sepal.Length > 5) |>
  summarise(promedio = mean(Sepal.Width))
  promedio
1 3.048305
  • Cómo encadenar operaciones: los “pipes” permiten escribir código paso a paso, de forma legible.

Empecemos con el manejo de datos

  • Vamos a trabajar exclusivamente con dplyr
  • tip: qué queremos hacer con los datos (escribir a mano?)

Leer, observar los datos

Nuestro ejemplo: pingüinos (penguins)
Tres especies en tres islas distintas datos recogidos durante tres años.
Datos sobre la longitud y profundidad del pico, la aleta, peso. penguins data presentation”

Leer, observar los datos

library(dplyr)
library(palmerpenguins)
library(scico)

data(package = 'palmerpenguins')
glimpse (penguins)
Rows: 344
Columns: 8
$ species           <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…
$ island            <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…
$ bill_length_mm    <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …
$ bill_depth_mm     <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …
$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…
$ body_mass_g       <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …
$ sex               <fct> male, female, female, NA, female, male, female, male…
$ year              <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…

1. Renombrar las variables con ‘rename’

Traducir al español

penguins %>% rename (long_pico = bill_length_mm)
# A tibble: 344 × 8
   species island    long_pico bill_depth_mm flipper_length_mm body_mass_g sex  
   <fct>   <fct>         <dbl>         <dbl>             <int>       <int> <fct>
 1 Adelie  Torgersen      39.1          18.7               181        3750 male 
 2 Adelie  Torgersen      39.5          17.4               186        3800 fema…
 3 Adelie  Torgersen      40.3          18                 195        3250 fema…
 4 Adelie  Torgersen      NA            NA                  NA          NA <NA> 
 5 Adelie  Torgersen      36.7          19.3               193        3450 fema…
 6 Adelie  Torgersen      39.3          20.6               190        3650 male 
 7 Adelie  Torgersen      38.9          17.8               181        3625 fema…
 8 Adelie  Torgersen      39.2          19.6               195        4675 male 
 9 Adelie  Torgersen      34.1          18.1               193        3475 <NA> 
10 Adelie  Torgersen      42            20.2               190        4250 <NA> 
# ℹ 334 more rows
# ℹ 1 more variable: year <int>

1. Renombrar las variables con ‘rename’

Traducir todas las columnas al español

penguins %>% rename (long_pico = bill_length_mm, 
                     anchura_pico = bill_depth_mm, 
                     long_aleta = flipper_length_mm, 
                     masa = body_mass_g,
                     sexo = sex,
                     año = year,
                     especies = species,
                     isla = island)
# A tibble: 344 × 8
   especies isla      long_pico anchura_pico long_aleta  masa sexo     año
   <fct>    <fct>         <dbl>        <dbl>      <int> <int> <fct>  <int>
 1 Adelie   Torgersen      39.1         18.7        181  3750 male    2007
 2 Adelie   Torgersen      39.5         17.4        186  3800 female  2007
 3 Adelie   Torgersen      40.3         18          195  3250 female  2007
 4 Adelie   Torgersen      NA           NA           NA    NA <NA>    2007
 5 Adelie   Torgersen      36.7         19.3        193  3450 female  2007
 6 Adelie   Torgersen      39.3         20.6        190  3650 male    2007
 7 Adelie   Torgersen      38.9         17.8        181  3625 female  2007
 8 Adelie   Torgersen      39.2         19.6        195  4675 male    2007
 9 Adelie   Torgersen      34.1         18.1        193  3475 <NA>    2007
10 Adelie   Torgersen      42           20.2        190  4250 <NA>    2007
# ℹ 334 more rows

2. Seleccionar columnas con ‘select’

Queremos todas las columnas, menos la de la isla

penguins %>% select (island, bill_length_mm, bill_depth_mm, flipper_length_mm, body_mass_g, sex, year)
# A tibble: 344 × 7
   island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex    year
   <fct>           <dbl>         <dbl>             <int>       <int> <fct> <int>
 1 Torge…           39.1          18.7               181        3750 male   2007
 2 Torge…           39.5          17.4               186        3800 fema…  2007
 3 Torge…           40.3          18                 195        3250 fema…  2007
 4 Torge…           NA            NA                  NA          NA <NA>   2007
 5 Torge…           36.7          19.3               193        3450 fema…  2007
 6 Torge…           39.3          20.6               190        3650 male   2007
 7 Torge…           38.9          17.8               181        3625 fema…  2007
 8 Torge…           39.2          19.6               195        4675 male   2007
 9 Torge…           34.1          18.1               193        3475 <NA>   2007
10 Torge…           42            20.2               190        4250 <NA>   2007
# ℹ 334 more rows
penguins %>% select (-species) #sería lo mismo
# A tibble: 344 × 7
   island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex    year
   <fct>           <dbl>         <dbl>             <int>       <int> <fct> <int>
 1 Torge…           39.1          18.7               181        3750 male   2007
 2 Torge…           39.5          17.4               186        3800 fema…  2007
 3 Torge…           40.3          18                 195        3250 fema…  2007
 4 Torge…           NA            NA                  NA          NA <NA>   2007
 5 Torge…           36.7          19.3               193        3450 fema…  2007
 6 Torge…           39.3          20.6               190        3650 male   2007
 7 Torge…           38.9          17.8               181        3625 fema…  2007
 8 Torge…           39.2          19.6               195        4675 male   2007
 9 Torge…           34.1          18.1               193        3475 <NA>   2007
10 Torge…           42            20.2               190        4250 <NA>   2007
# ℹ 334 more rows

2. Seleccionar columnas con ‘select’

Queremos todas las columnas, menos la del año y la del sexo del pingüino.

# concatenamos variables con c()
penguins %>% select (-c(sex, year))
# A tibble: 344 × 6
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows

2. Seleccionar columnas con ‘select’

Podemos seleccionar, cambiar el orden y renombrar al mismo tiempo con ‘select’

penguins %>% select (year, sex, species, 
                     long_pico = bill_length_mm, 
                     anchura_pico = bill_depth_mm, 
                     long_aleta = flipper_length_mm)
# A tibble: 344 × 6
    year sex    species long_pico anchura_pico long_aleta
   <int> <fct>  <fct>       <dbl>        <dbl>      <int>
 1  2007 male   Adelie       39.1         18.7        181
 2  2007 female Adelie       39.5         17.4        186
 3  2007 female Adelie       40.3         18          195
 4  2007 <NA>   Adelie       NA           NA           NA
 5  2007 female Adelie       36.7         19.3        193
 6  2007 male   Adelie       39.3         20.6        190
 7  2007 female Adelie       38.9         17.8        181
 8  2007 male   Adelie       39.2         19.6        195
 9  2007 <NA>   Adelie       34.1         18.1        193
10  2007 <NA>   Adelie       42           20.2        190
# ℹ 334 more rows

3. Valores únicos con ‘distinct’

penguins %>%
  distinct(island)
# A tibble: 3 × 1
  island   
  <fct>    
1 Torgersen
2 Biscoe   
3 Dream    
penguins %>%
  distinct(species, island)
# A tibble: 5 × 2
  species   island   
  <fct>     <fct>    
1 Adelie    Torgersen
2 Adelie    Biscoe   
3 Adelie    Dream    
4 Gentoo    Biscoe   
5 Chinstrap Dream    

4. Filtrar con ‘filter’

Filtrar por un valor (asignaciones lógicas)

# recordad: == para condición lógica de "igual a"
penguins_filtered  <- penguins %>% filter (year == 2007)

Filtrar por varios valores

penguins_filtered  <- penguins %>% filter (year == 2007, sex == "female")

Filtrar por varios valores que incluyen varias condiciones

penguins_filtered  <- penguins %>% 
  filter (year > 2008, sex == "female", 
          island %in% c("Dream", "Biscoe"))

penguins_filtered %>%
  select (island, year, sex) %>% 
  distinct()
# A tibble: 2 × 3
  island  year sex   
  <fct>  <int> <fct> 
1 Biscoe  2009 female
2 Dream   2009 female

4. Filtrar con ‘filter’

Filtrar fuera, quitar valores

penguins_filtered <- penguins %>%
  filter(!is.na(body_mass_g))

penguins_filtered <- penguins %>%
  filter(year != 2007)

penguins_filtered <- penguins %>%
  filter(!year == 2007)

penguins_filtered %>% select(year) %>% distinct()
# A tibble: 2 × 1
   year
  <int>
1  2008
2  2009

Importante

BASE DE DATOS %>%
    FUNCION (nombre_nuevo = hacemos algo aquí dentro,
             nombre_nuevo_2 = que esto == sea igual a esto) %>%
    OTRAFUNCION (calculamos la media) %>%
    ULTIMAFUNCION (filtramos por unos datos,
                   filtramos por otra columna)

5. Transformar variables con ‘mutate’

Crear nuevas variables

# Masa en kg
penguins_mut <- penguins %>%
  mutate(body_mass_kg = body_mass_g / 1000) 

# Ratio del pico
penguins %>%
  mutate(bill_ratio = bill_length_mm / bill_depth_mm) %>%
  select(bill_length_mm, bill_depth_mm, bill_ratio)
# A tibble: 344 × 3
   bill_length_mm bill_depth_mm bill_ratio
            <dbl>         <dbl>      <dbl>
 1           39.1          18.7       2.09
 2           39.5          17.4       2.27
 3           40.3          18         2.24
 4           NA            NA        NA   
 5           36.7          19.3       1.90
 6           39.3          20.6       1.91
 7           38.9          17.8       2.19
 8           39.2          19.6       2   
 9           34.1          18.1       1.88
10           42            20.2       2.08
# ℹ 334 more rows

6. Resumir variables con ‘summarise’

Dentro de summarise podemos hacer operaciones que van asignadas a una variable con un nombre nuevo.

penguins %>%
  summarise (mean (body_mass_g, na.rm = TRUE))
# A tibble: 1 × 1
  `mean(body_mass_g, na.rm = TRUE)`
                              <dbl>
1                             4202.
# Añadimos nombre de la columna nueva
penguins %>%
  summarise (promedio_pico = mean (body_mass_g, na.rm = TRUE))
# A tibble: 1 × 1
  promedio_pico
          <dbl>
1         4202.
# Podemos hacer otros cálculos
penguins %>% 
  group_by(species) %>%
  summarise (promedio_peso_kg = mean (body_mass_g, na.rm = TRUE)/1000)
# A tibble: 3 × 2
  species   promedio_peso_kg
  <fct>                <dbl>
1 Adelie                3.70
2 Chinstrap             3.73
3 Gentoo                5.08

Muy útil para explorar los datos y resumirlos en una tabla para un artículo.

7. Agrupar variables con ‘group_by’

penguins %>% 
  group_by(species) %>%
  summarise (promedio_peso_kg = mean (body_mass_g, na.rm = TRUE)/1000)
# A tibble: 3 × 2
  species   promedio_peso_kg
  <fct>                <dbl>
1 Adelie                3.70
2 Chinstrap             3.73
3 Gentoo                5.08
penguins %>% 
  group_by(species) %>%
  summarise (promedio_peso_kg = mean (body_mass_g, na.rm = TRUE)/1000,
             conteo_años = n_distinct(year)
  )
# A tibble: 3 × 3
  species   promedio_peso_kg conteo_años
  <fct>                <dbl>       <int>
1 Adelie                3.70           3
2 Chinstrap             3.73           3
3 Gentoo                5.08           3

8. Aplicar condiciones con ‘if_else’

Muy útil para corregir datos

# Queremos que data vez que ponga 2008, sea en realidad 2010
penguins_filtered <- penguins %>%
  mutate(year_2 = if_else(year == 2008, 2010, year))

penguins %>%
  mutate(year_2 = if_else(year == 2008, 2010, year)) %>%
  arrange(desc(year_2)) %>% select (year, year_2) %>% distinct()
# A tibble: 3 × 2
   year year_2
  <int>  <dbl>
1  2008   2010
2  2009   2009
3  2007   2007
# Que los NA en realidad corresponden con los polluelos
penguins_filtered <- penguins %>% 
  mutate (family = if_else(is.na(sex), "chick", sex))

penguins %>% 
  mutate (family = if_else(is.na(sex), "chick", sex)) %>% 
   select (sex, family) %>% distinct()
# A tibble: 3 × 2
  sex    family
  <fct>  <chr> 
1 male   male  
2 female female
3 <NA>   chick 

8. Aplicar condiciones con ‘if_else’

O reclasificar: convertir el sexo en una categoría binaria o dummy

penguins %>% 
  mutate (sex_binary = if_else(sex=="male", 0, 1))
# A tibble: 344 × 9
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows
# ℹ 3 more variables: sex <fct>, year <int>, sex_binary <dbl>

Otras funciones interesantes

  • case_when () para filtrar datos por casos
  • pivot_wider () para convertir a formato corto
  • pivor_longer () para convertir a formato largo
  • arrange() ordenar de mayor a menor, menor a mayor
  • relotate() cambiar las columnas de orden

Sois autodidactas (bibliografía, chatgpt, google, stackoverflow, etc)

Combinar dos bases de datos con ‘join’

  1. datos con los nombres taxonómicos (nombres de las especies)
  2. datos con los rasgos de las especies
taxonomy <- data.frame (species = unique(penguins$species),
                    species_name = c("Pygoscelis adeliae",  
                                     "Pygoscelis papua", 
                                     "Pygoscelis antarcticus"))
taxonomy
    species           species_name
1    Adelie     Pygoscelis adeliae
2    Gentoo       Pygoscelis papua
3 Chinstrap Pygoscelis antarcticus

Ambas tienen la especie en común

setdiff(taxonomy$species, penguins$species)
character(0)
penguins_join <- penguins %>% 
  left_join (taxonomy, by ="species") 
glimpse(penguins)
Rows: 344
Columns: 8
$ species           <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…
$ island            <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…
$ bill_length_mm    <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …
$ bill_depth_mm     <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …
$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…
$ body_mass_g       <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …
$ sex               <fct> male, female, female, NA, female, male, female, male…
$ year              <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…
library(DT)
datatable(penguins_join)

Ejemplo datos inscripción curso

library(tm)
library(wordcloud2)
library(readxl)
library(here)
library(stringr)

datos_curso <- read_excel(here("data/datos-curso.xlsx"))
datos_curso
# A tibble: 19 × 15
      Id `Hora de inicio`    `Hora de finalización` `Correo electrónico` Nombre
   <dbl> <dttm>              <dttm>                 <chr>                <lgl> 
 1     1 2025-10-14 08:29:14 2025-10-14 08:37:19    anonymous            NA    
 2     2 2025-10-14 08:42:03 2025-10-14 08:44:21    anonymous            NA    
 3     3 2025-10-14 08:40:20 2025-10-14 08:47:24    anonymous            NA    
 4     4 2025-10-14 09:48:46 2025-10-14 09:51:19    anónimo              NA    
 5     5 2025-10-14 09:52:44 2025-10-14 10:25:40    anónimo              NA    
 6     6 2025-10-14 10:37:18 2025-10-14 10:39:54    anónimo              NA    
 7     7 2025-10-14 11:03:08 2025-10-14 11:03:46    anónimo              NA    
 8     8 2025-10-14 11:06:44 2025-10-14 11:07:45    anónimo              NA    
 9     9 2025-10-14 11:40:51 2025-10-14 11:47:18    anónimo              NA    
10    10 2025-10-14 13:03:53 2025-10-14 13:06:51    anónimo              NA    
11    11 2025-10-14 13:50:48 2025-10-14 13:54:46    anónimo              NA    
12    12 2025-10-14 14:06:02 2025-10-14 14:09:00    anónimo              NA    
13    13 2025-10-14 14:41:19 2025-10-14 14:50:00    anónimo              NA    
14    14 2025-10-14 15:00:44 2025-10-14 15:03:13    anónimo              NA    
15    15 2025-10-15 16:50:04 2025-10-15 16:54:28    anónimo              NA    
16    16 2025-10-15 21:43:56 2025-10-15 21:47:22    anónimo              NA    
17    17 2025-10-20 15:49:58 2025-10-20 15:52:00    anónimo              NA    
18    18 2025-10-22 17:32:48 2025-10-22 17:37:49    anónimo              NA    
19    19 2025-10-28 12:22:05 2025-10-28 12:23:05    anónimo              NA    
# ℹ 10 more variables: `Comentarios: DNI o documento` <lgl>,
#   `Curso de la primera matrícula en el programa de doctorado` <chr>,
#   `Puntos: Curso de la primera matrícula en el programa de doctorado` <dbl>,
#   `Comentarios: Curso de la primera matrícula en el programa de doctorado` <lgl>,
#   `Cuéntanos tu experiencia con R` <chr>,
#   `Puntos: Cuéntanos tu experiencia con R` <dbl>,
#   `Comentarios: Cuéntanos tu experiencia con R` <lgl>, Observaciones <chr>, …

¿Qué otra función podríamos usar para ver los datos?

colnames(datos_curso) # Miramos las columnas que tiene
 [1] "Id"                                                                    
 [2] "Hora de inicio"                                                        
 [3] "Hora de finalización"                                                  
 [4] "Correo electrónico"                                                    
 [5] "Nombre"                                                                
 [6] "Comentarios: DNI o documento"                                          
 [7] "Curso de la primera matrícula en el programa de doctorado"             
 [8] "Puntos: Curso de la primera matrícula en el programa de doctorado"     
 [9] "Comentarios: Curso de la primera matrícula en el programa de doctorado"
[10] "Cuéntanos tu experiencia con R"                                        
[11] "Puntos: Cuéntanos tu experiencia con R"                                
[12] "Comentarios: Cuéntanos tu experiencia con R"                           
[13] "Observaciones"                                                         
[14] "Puntos: Observaciones"                                                 
[15] "Comentarios: Observaciones"                                            
glimpse(datos_curso) 
Rows: 19
Columns: 15
$ Id                                                                       <dbl> …
$ `Hora de inicio`                                                         <dttm> …
$ `Hora de finalización`                                                   <dttm> …
$ `Correo electrónico`                                                     <chr> …
$ Nombre                                                                   <lgl> …
$ `Comentarios: DNI o documento`                                           <lgl> …
$ `Curso de la primera matrícula en el programa de doctorado`              <chr> …
$ `Puntos: Curso de la primera matrícula en el programa de doctorado`      <dbl> …
$ `Comentarios: Curso de la primera matrícula en el programa de doctorado` <lgl> …
$ `Cuéntanos tu experiencia con R`                                         <chr> …
$ `Puntos: Cuéntanos tu experiencia con R`                                 <dbl> …
$ `Comentarios: Cuéntanos tu experiencia con R`                            <lgl> …
$ Observaciones                                                            <chr> …
$ `Puntos: Observaciones`                                                  <dbl> …
$ `Comentarios: Observaciones`                                             <lgl> …

Vamos a filtrar y ordenar un poco nuestra bbdd

datos_curso_filtrado <- datos_curso %>%
  rename (
    curso = "Curso de la primera matrícula en el programa de doctorado",
    experiencia = "Cuéntanos tu experiencia con R",
    comentarios = "Observaciones",
    email = "Correo electrónico"
  ) %>%
  select (curso, experiencia, comentarios, email) %>%
  mutate (email = str_replace(email, "anonymous", "anónimo")) 

glimpse(datos_curso_filtrado)
Rows: 19
Columns: 4
$ curso       <chr> "2024-25", "2023-24", "2022-23", "2023-24", "2023-24", "No…
$ experiencia <chr> "He usado R ya en anteriores ocasiones, tengo una pequeña …
$ comentarios <chr> NA, NA, NA, NA, "Estoy interesada en aprender a usar R par…
$ email       <chr> "anónimo", "anónimo", "anónimo", "anónimo", "anónimo", "an…
words <- tolower(unlist(strsplit(datos_curso_filtrado$experiencia, " ")))

words <- gsub("[[:punct:][:digit:]]", "", words)
stop_es <- stopwords("spanish")
words_clean <- words[!words %in% stop_es]

# Plot
word_course_r <-  wordcloud2(
  data = table(words_clean),
  size = 0.5,
  color = rep(RColorBrewer::brewer.pal(11, "PRGn"), 20)
)

WordCloud

WordCloud

Ejercicios manejo de datos

Como ayer pero con dplyr!

Base de datos de flores en Doñana

code = código de la observación
site_id = lugar y numero de visita
pantrap = número de pantrap 1:9
species = especie de planta
abundance = número de flores por individuo

Ejercicio 1. Importa la base de datos “flores.csv” de la carpeta “data”, explora la base de datos, calcula la abundancia media de flores total, indica cuantas especies distintas hay de plantas, crea una base de datos con el número de individuos por especie. Guardala como csv.

Pantrap

Resolvemos

flores <- read.csv (here("data/flores.csv"))

# Estructura de los datos
glimpse (flores)
Rows: 490
Columns: 5
$ code      <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1…
$ site_id   <chr> "ANZ_1", "ANZ_1", "ANZ_1", "ANZ_1", "ANZ_1", "ANZ_1", "ANZ_1…
$ pantrap   <int> 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5, 5, 5, 6, 7, 8, 8, 9, …
$ species   <chr> "Oxalis pes-caprae", "Cistus salvifolius", "Ornithogalum umb…
$ abundance <int> 3, 16, 4, 2, 3, 4, 1, 3, 1, 8, 2, 2, 1, 1, 2, 3, 12, 2, 6, 6…
# Media de abundancia
flores %>% 
  summarise (media_abundancia = mean(abundance, na.rm = TRUE))
  media_abundancia
1         16.45102
# Número de especies únicas
flores %>% 
  summarise (n_especies = n_distinct(species))
  n_especies
1         74
# Listado de especies únicas
flores %>% 
  distinct(species)
                    species
1         Oxalis pes-caprae
2        Cistus salvifolius
3   Ornithogalum umbellatum
4      Aristolochia baetica
5    Geranium rotundifolium
6  Aristolochia paucinervis
7           Reseda phyteuma
8            Ranunculus sp.
9           Anemone palmata
10           Cistus crispus
11           Cistus albidus
12       Erodium cicutarium
13       Lavandula stoechas
14                 Ulex sp.
15       Anagallis arvensis
16         Cistus ladanifer
17                       na
18   Rosmarinus officinalis
19               Crepis sp.
20       Xolantha tuberaria
21    Lupinus angustifolius
22          Linaria spartea
23     Centaurea calcitrapa
24       Misopates orontium
25       Halimium calycinum
26               Echium sp.
27          Senecio pequeño
28         Malcolmia lacera
29        Acis trichophylla
30            Leontodon sp.
31    Raphanus raphanistrum
32              Erodium sp.
33    Halimium halimifolium
34           Cerinthe major
35                Linum sp.
36                  Muscari
37                  Erodium
38      Echium plantagineum
39                Vicia sp.
40          Silene colorata
41        Sonchus oleraceus
42       Carduus bourgeanus
43              Senecio sp.
44         Dipcadi serotium
45   Leontodon longirostris
46            Arum italicum
47            Centaurea sp.
48          Genista hirsuta
49      Lysimachia arvensis
50              Carduus sp.
51          Lathyrus ochrus
52          Muscari romoani
53           Daphne gnidium
54  Convolvulus althaeoides
55    Parentucellia viscosa
56     Cistus monspeliensis
57   Bituminaria bituminosa
58           Tolpis barbata
59    Campanula matritensis
60         Cistus libanotis
61          Stellaria media
62     Galactites tomentosa
63        Anthemis arvensis
64                 Calycium
65    Andryala integrifolia
66        Gladius illyricus
67              Dipcadi sp.
68     Chrysantenum sesetum
69          Serapias lingua
70         Leopoldia comosa
71     Cynoglossum creticum
72       Bellardia trixiajo
73         Xolantha guttata
74          Thapsia villosa
# Crea una base de datos con el número de individuos por especie. Guardala como csv. 

# Conteo de registros por especie
count_flowers <- flores %>% count(species)
count_flowers
                    species   n
1         Acis trichophylla   4
2        Anagallis arvensis   1
3     Andryala integrifolia  11
4           Anemone palmata  22
5         Anthemis arvensis   6
6      Aristolochia baetica  10
7  Aristolochia paucinervis   4
8             Arum italicum   1
9        Bellardia trixiajo   1
10   Bituminaria bituminosa   4
11                 Calycium   1
12    Campanula matritensis   1
13       Carduus bourgeanus   1
14              Carduus sp.   2
15     Centaurea calcitrapa   3
16            Centaurea sp.   1
17           Cerinthe major   1
18     Chrysantenum sesetum   3
19           Cistus albidus  11
20           Cistus crispus   8
21         Cistus ladanifer   2
22         Cistus libanotis   3
23     Cistus monspeliensis   2
24       Cistus salvifolius 114
25  Convolvulus althaeoides   8
26               Crepis sp.   5
27     Cynoglossum creticum   1
28           Daphne gnidium   1
29         Dipcadi serotium   2
30              Dipcadi sp.   1
31      Echium plantagineum   9
32               Echium sp.   4
33                  Erodium   1
34       Erodium cicutarium   4
35              Erodium sp.   9
36     Galactites tomentosa   9
37          Genista hirsuta   5
38   Geranium rotundifolium   2
39        Gladius illyricus   1
40       Halimium calycinum   9
41    Halimium halimifolium  12
42          Lathyrus ochrus   1
43       Lavandula stoechas  12
44   Leontodon longirostris   7
45            Leontodon sp.  23
46         Leopoldia comosa   1
47          Linaria spartea  10
48                Linum sp.   2
49    Lupinus angustifolius   2
50      Lysimachia arvensis   2
51         Malcolmia lacera  11
52       Misopates orontium   2
53                  Muscari   2
54          Muscari romoani   1
55  Ornithogalum umbellatum   1
56        Oxalis pes-caprae   4
57    Parentucellia viscosa   1
58           Ranunculus sp.   2
59    Raphanus raphanistrum   1
60          Reseda phyteuma   7
61   Rosmarinus officinalis  10
62          Senecio pequeño   5
63              Senecio sp.   1
64          Serapias lingua   1
65          Silene colorata  20
66        Sonchus oleraceus   2
67          Stellaria media   1
68          Thapsia villosa   1
69           Tolpis barbata   3
70                 Ulex sp.   2
71                Vicia sp.   1
72         Xolantha guttata   6
73       Xolantha tuberaria  44
74                       na   1
write.csv (count_flowers, here("data/count_flowers.csv"))

Otro ejercicio 🪐

La base de datos “starwars”

Tema: personajes de Star Wars (altura, peso, planeta, especie, etc.)

  1. Selecciona las columnas name, species, height, mass, homeworld
    Filtra solo humanos y droides
    Crea una columna con la variable del IMC
    Clasifica un IMC mayor de 25 en “alto” y menor en “bajo” en otra columna
    Guardalo en una base de datos nueva

  2. Resume por especie la media de la masas y la altura en metros
    Quién puede alcanzar una masa corporal mayor, los humanos o droides?

  3. ¿Qué personajes pesan más de 100 kg y pertenecen a la especie Human?

  4. ¿Cuántos personajes hay por cada tipos de pelo? Si hay NA, crea una categoría que sea “no_hair”.

Resolvemos

# glimpse (starwars)

#1
star_filtered <- starwars %>%
  select (name, species, height, mass, homeworld) %>%
  filter (species %in% c("Human", "Droid")) %>%
  mutate (imc = mass/(height/100)^2) %>%
  mutate (img_cat = if_else (imc > 25, "alto", "bajo"))


starwars %>%
  group_by(species) %>%
  summarise (mass_mean = mean (mass, na.rm = T),
             height_mean = mean (height, na.rm = T)/100)
# A tibble: 38 × 3
   species   mass_mean height_mean
   <chr>         <dbl>       <dbl>
 1 Aleena         15          0.79
 2 Besalisk      102          1.98
 3 Cerean         82          1.98
 4 Chagrian      NaN          1.96
 5 Clawdite       55          1.68
 6 Droid          69.8        1.31
 7 Dug            40          1.12
 8 Ewok           20          0.88
 9 Geonosian      80          1.83
10 Gungan         74          2.09
# ℹ 28 more rows

Resolvemos

#2
starwars %>%
 filter (species %in% c("Human", "Droid")) %>%
  group_by(species) %>%
  summarise (mass_max = max (mass, na.rm = T))
# A tibble: 2 × 2
  species mass_max
  <chr>      <dbl>
1 Droid        140
2 Human        136

Resolvemos

#3
starwars %>%
  filter (mass>100, species == "Human")
# A tibble: 2 × 14
  name      height  mass hair_color skin_color eye_color birth_year sex   gender
  <chr>      <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
1 Darth Va…    202   136 none       white      yellow          41.9 male  mascu…
2 Owen Lars    178   120 brown, gr… light      blue            52   male  mascu…
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>

Resolvemos

#4

starwars %>%
  mutate (hair_color = if_else (is.na(hair_color), "no_hear", hair_color)) %>%
  group_by (hair_color) %>%
  summarise (color = n_distinct(name))
# A tibble: 12 × 2
   hair_color    color
   <chr>         <int>
 1 auburn            1
 2 auburn, grey      1
 3 auburn, white     1
 4 black            13
 5 blond             3
 6 blonde            1
 7 brown            18
 8 brown, grey       1
 9 grey              1
10 no_hear           5
11 none             38
12 white             4